﻿using XiaLastorm.Sharpshooter.Server;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Threading;
using System.Collections.Generic;
using System.Net.Sockets;

namespace TestProject1
{
	
	
	/// <summary>
	///这是 ServerTest 的测试类，旨在
	///包含所有 ServerTest 单元测试
	///</summary>
	[TestClass()]
	public class ServerTest
	{


		private TestContext testContextInstance;

		/// <summary>
		///获取或设置测试上下文，上下文提供
		///有关当前测试运行及其功能的信息。
		///</summary>
		public TestContext TestContext
		{
			get
			{
				return testContextInstance;
			}
			set
			{
				testContextInstance = value;
			}
		}

		#region 附加测试特性
		// 
		//编写测试时，还可使用以下特性:
		//
		//使用 ClassInitialize 在运行类中的第一个测试前先运行代码
		//[ClassInitialize()]
		//public static void MyClassInitialize(TestContext testContext)
		//{
		//}
		//
		//使用 ClassCleanup 在运行完类中的所有测试后再运行代码
		//[ClassCleanup()]
		//public static void MyClassCleanup()
		//{
		//}
		//
		//使用 TestInitialize 在运行每个测试前先运行代码
		//[TestInitialize()]
		//public void MyTestInitialize()
		//{
		//}
		//
		//使用 TestCleanup 在运行完每个测试后运行代码
		//[TestCleanup()]
		//public void MyTestCleanup()
		//{
		//}
		//
		#endregion


		/// <summary>
		///Start 的测试
		///</summary>
		[TestMethod()]
		[ExpectedException(typeof(Exception))]
		public void CanNotStartTwiceTest()
		{
			Server target = new Server();
			target.Open();
			target.Close();
			target.Open();
			target.Close();
		}

		/// <summary>
		///测试服务器的多线程稳定性
		///</summary>
		[TestMethod()]
		public void NormalTest()
		{
			Server target = new Server();
			target.Open();
			List<XiaLastorm.Sharpshooter.Client.Client> clients = new List<XiaLastorm.Sharpshooter.Client.Client>();
			for(int i = 0; i < 10; ++i)
			{
				XiaLastorm.Sharpshooter.Client.Client client = new XiaLastorm.Sharpshooter.Client.Client("localhost");
				clients.Add(client);
				client.Open();
				client.LogIn(i.ToString(), string.Empty);
			}
			foreach (var client in clients)
			{
				client.Close();
			}
			target.Close();
		}

		/// <summary>
		///测试服务器的多线程稳定性
		///</summary>
		[TestMethod()]
		public void NormalTest1()
		{
			Server target = new Server();
			target.Open();
			Thread.Sleep(3000);
			target.Close();
		}
		/// <summary>
		///测试客户端发送非法数据时服务器的稳定性
		///</summary>
		[TestMethod()]
		public void IllegalDataTest()
		{
			Server target = new Server();
			target.Open();
			Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
			socket.Connect("localhost", XiaLastorm.Sharpshooter.Client.Client.ServerPort);
			socket.Send(System.Text.Encoding.Unicode.GetBytes("sldkfsdfjs"));
			socket.Close();
			target.Close();
		}
	}
}
